                             - 392 -

               2.   .

        ,   -
      ,     
 .       -
     ,   -
       -
,              .
 4      :

   1.           .
,      ,   
        
    .      
    .

   2.       ,  -
      (..  
     ,          
[1.3.5]).

   3.      , 
   ,     .
           
  .     -
,      ,      [1.3.4].
        
.

   4.     ,   -
      CONFIG.SYS.  MS DOS -
         
    DOS,   .
  IOCTL ( /)  -
           ,
   .

            ,
      .   
   .     ,   
.            -
  ,           .
    , , SERIALPR   -
 ,       -
       .      OPEN  "SE-
RIALPR" FOR OUTPUT AS #2     
.          
         ,    
  ,     IOCTL. 
        -
         COPY A:MY-
FILE SERIALPR:,      .
          
   .        :
  .     ,  -
   .      
    ,       - 
,       -
.       ,  
  .   

                             - 393 -

 ,           
,      ,      
   .    
      ,    -
.        . -
    MS DOS    -
         -
  .         
      , -
 .
         -
 .      -
   ,      -
  .      
 .
         , 
         .   (1)
 ,       -
    , (2)  , -
        ,   MS  DOS,
   ,  (3)  
,    ,  .

                             - 394 -

   7.2.1   .

               COM  
[1.3.6].      , 
      .   
     ORG  100H   , 
     COM .    ORG 0,   
  .          (far)
,       .     
        DEVICE12.
      AUX,   MS  DOS,
   4   21H.   
       ,    -
  ;        , 
  .
         .  
  18 ,    5 .    (DD)
   -1 (FFFFFFFFH),   MS DOS 
,         -
.     ,        
.         
 -1.
        .   
7   :

 15   1 =  , 0 =  
    14   1 =  IOCTL, 0 =   IOCTL
    13   1 =   IBM, 0 =   
     3   1 = , 0 =  
     2   1 =  , 0 =   
     1   1 =   , 0 = 
     0   1 =   , 0 = 

    15,   15  14,  -
  IOCTL (   [7.2.4]).   13  -
    .    -
     ,  MS DOS    
(         
;       
    BIOS;       (NULL) - 
,    ).
           -
   ,     
.  ,     .   
    8           
    .      
DOS ,    LPT1    COM1,     
,    .

    .

           -
. "DEVICE12" -    ,       
   ,     .  
       15,    -
       IOCTL.  DEV_STRATEGY
 DEV_INTERRUPT -  ,     -

                             - 395 -

.     AUX,       -
 MS DOS    .       -
   ,    -
        AUX (-
).         ,  
  COM .

CSEG      SEGMENT PUBLIC 'CODE'   '  
          ORG 0                   '  
          ASSUME CS:CSEG,DS:CSEG,ES:CSEG
DEVICE12  PROC FAR         '   
          DD   0FFFFFFFFH  '  
          DW   8000H       ' 
          DW   DEV_STATEGY '  
          DW   DEV_INTERRUPT  '  
          DB   'AUX     ' '  ( )

                             - 396 -

   7.2.2   .

              .
    ,      ,
  .    . - 
        .   
 ,       ,   
           
. ,    ,   
    .     
 ,         -
,     ,     -
    .
   MS DOS         -
  (   ).     -
       .   ES:BX
         
  ,        
    .       
   .      , 
    ,     - 
 ES:BX,       
.
       ,    
    (.  ,  
  ).   13    
  .   :

1.    (DB).
2.   (DB).     .
3.     (DB).       
 .     [7.2.3].
4.  (DW).           
.    15,      -
  .     [7.2.3].
5.   (8 ).  MS DOS.
6.      ( ).

    .

    5     . ,  
  ,   ES  BX,    -
 RET,      COM.

DEV_STRATEGY:   MOV  CS:KEEP_ES,ES
                MOV  CS:KEEP_BX,BX
                RET
KEEP_CS         DW ?
KEEP_BX         DW ?

                             - 397 -

   7.2.3    .

          , 
   .      
  .   ,  , -
      ,    
       
RET.
     13  ,     -
  .      DOS
(   3FH    21H,     
  ),       1  
13          2     (
 -   5).      
   ,       
     [7.2.1].       
  ES:BX,       -
  ,      .     
         ,
    .      
13- ,        13  .
     :

   1. INITIALIZE ()
   2. CHECK_MEDIA ( )
   3. MAKE_BPB
   4. IOCTL_IN
   5. INPUT_DATA ( )
   6. NONDESTRUCT_IN
   7. INPUT_STATUS ( )
   8. CLEAR_INPUT ( )
   9. OUTPUT_DATA ( )
  10. OUTPUT_VERIFY ( )
  11. OUTPUT_STATUS ( )
  12. CLEAR_OUTPUT ( )
  13. IOCTL_OUT

       ,     
  RET      -
 .       -
   ,        -
       .  
,       ,   
     -.     
         15, 8, 1  0  
,    ,   -
     (  15    ,  8
,    ,   0  1  
 3,   " ").
             -
,     1 - .    -
    ,   .  
  ,     ,    
      ,   
14   .     
  eop:.    ,   
           
.  .  7-4    -
.

                             - 398 -

        12-       
   ,    . ,
    CHECK_MEDIA   MAKE_BPB,      
  (       ,    
..).           
: INPUT_DATA   OUTPUT_DATA  (,    -
  -     ,  ).
       :

13        
 1          (   )
 4      /   
 2       ,   
 2         (  )

     . ,
        ,  
     ( 14).   -
   ,    ( 18).   
   ,      
  ( 3)   .   -
 ,         8  . 
   .

    .

              
,    ,  .

;---   
DEV_INTERRUPT:  PUSH ES     ; 
                PUSH DS
                PUSH AX
                PUSH BX
                PUSH CX
                PUSH DX
                PUSH SI
                PUSH DI
                PUSH BP
   MOV  AX,CS:KEEP_ES    ;ES:BX    
   MOV  ES,AX            ;
   MOV  BX,CS:KEEP_BX    ;
   MOV  AL,ES:[BX]+2     ;    
   SHL  AL,1             ;  2 (..  )
   SUB  AH,AH            ; AH
   LEA  DI,FUNCTIONS     ;DI     
   ADD  DI,AX            ;   
   JMP  WORD PTR [DI]    ;    

FUNCTIONS       LABEL  WORD  ;  
   DW   INITIALIZE
   DW   CHECK_MEDIA
   DW   MAKE_BPB
   DW   IOCTL_IN
   DW   INPUT_DATA
   DW   NONDESTRUCT_IN

                             - 399 -

   DW   INPUT_STATUS
   DW   CLEAR_INPUT
   DW   OUTPUT_DATA
   DW   OUTPUT_VERIFY
   DW   OUTPUT_STATUS
   DW   CLEAR_OUTPUT
   DW   IOCTL_OUT

;---  ,    
CHECK_MEDIA:
MAKE_BPB:
IOCTL_IN:
INPUT_DATA:
NONDESTRUCT_IN:
INPUT_STATUS:
CLEAR_INPUT:
OUTPUT_VERIFY:
OUTPUT_STATUS:
CLEAR_OUTPUT:
IOCTL_OUT:
   OR   ES:WORD PTR [BX]+3,8103H   ; 
   JMP  QUIT

;---    
INITIALIZE:   LEA  AX,E_O_P      ;    AX
   MOV  ES:WORD PTR [BX]+14,AX   ;   
   MOV  ES:WORD PTR [BX]+16,CS   ;
    .
   (   )
    .
   JMP  QUIT

OUTPUT_DATA:  MOV  CL,ES:[BX]+18 ;  
   CBW  CX                       ;CX   
   MOV  AX,ES:[BX]+16            ;   
   MOV  DS,AX                    ;
   MOV  DX,ES:[BX]+14            ;
    .
   (    )
    .
   JMP  QUIT

;---,      
QUIT:   OR   ES:WORD PTR [BX]+3,100H  ;  8
   POP BP                    ; 
   POP DI                    ;
   POP SI                    ;
   POP DX                    ;
   POP CX                    ;
   POP BX                    ;
   POP AX                    ;
   POP DS                    ;
   POP ES                    ;
   RET
E_O_P:              ;  
DEVICE12     ENDP
CSEG         ENDS
             END    DEVICE12

                             - 400 -

          -
 .         ,  -
         
.    : OR ES:WORD PTR [BX]+3,XXXXH. -
  XXXX :

    0-7     (  15 = 1)
       8     1,   
       9     1,   
  10-14    MS DOS
      15      

           , 
  15,  :

   0          
   1     
   2      
   3     
   4        
   5        
   6     
   7     
   8      
   9       
   A     
   B     
   C     

                             - 401 -

   7.2.4    .

         -
     .    
       CONFIG.SYS    DEVICE  = DEVI-
CE12.COM.          .
     ,     
   .
       ,     -
   MS  DOS    21H.    
     ,    -
  DOS (   )   -
     .    
 ,      AUX,  
  3 [7.1.7]  4 [7.1.6]  21H   
    .      , 
    PRN,    5 [6.3.1]    
  .        
 3FH [5.4.4]    [5.4.3]  .   
   3 -      4
-  .  ,    -
      .
             MS
DOS (..         ,  
PRN, AUX  ..),        
    .       
      ,    -
 ,   .     -
,         ,  
  BX, 0 -  AL,     44H 
21H.   IOCTL     7 ,   DL
,    .
   IOCTL  ,          -
         -
   IOCTL      
.  IOCTL  8  ,   0
  7,        AL 
 :

   0         DX
   1       ,  DL (DH=0)
   2     CX      -
               DS:DX
   3     CX      
        ,     DS:DX
   4     ,   2,      BL,
         0 =   , 1 = A  ..
   5     ,   3,       5
   6      
   7      

        ,     
,   .    0  1  
  DX  ( ,   7 = 1,  ,
    ,    ):

                             - 402 -

   0    1 =   
   1    1 =   
   2    1 =  
   3    1 =  
   4    
   5    1 =    Ctrl-Z, 0 =    Ctrl-Z
   6    1 =   , 0 =  
   7    1 = , 0 =  
8-13    
  14    1 =     2  3, 0 = 
  15    

    2-5       
   .      
         , 
  .    AX   
 .   6-7   ,
       .       AL
 FF,       0,  .   -
    ( 7 = 0)  AL  FF 
 ,      .
   ,    3.0   IOCTL  IOCTL$.
   , ,   
     ,  
    OPEN.     
   ,   IOCTL #3,"...".  ,
A$ = IOCTL$(3)      IOCTL.

                             - 403 -

   7.2.5     .

          . 
           -
.      ,  -
. , ,     -
   (,    ,   -
    ). MS DOS   -
          
.

    .

            , 
   .     
          
,    .     
 ,       
         
,   .     
      .   
  ,       -
,    ,     -
.   ,     ,  
     ,      (
 ).      
     .   ,
         -
        4      
.
            
   ON ERROR GOSUB n,  n     -
,      .   -
          
.           IF ERR = n
THEN  ,   n -  ,     
  ,     . 
      , -
   .        
       IF ERL = n THEN  .
ERL   ,    , 
     .
           
     RESUME      
,   .      
,            -
  .  ,  ,     
RESUME      ,    -
 ,    .  
  ,  ,   -
   ,   RESUME NEXT    -
  ,   ,    . 
     :

                             - 404 -

100 ON ERROR GOSUB 5000   '  
 .
 .
5000 IF ERR = 61 THEN 5100  ' 
5010 IF ERR = 71 THEN 5200  '  
 .
 .
5100 IF ERL = 2080 THEN 5120   '  ?
5110 BEEP: PRINT "Disk in drive B: is full": RESUME
5120 BEEP: PRINT "Disk in drive A: is full": RESUME
 .
5200 BEEP: PRINT "A disk drive is not ready"
5210 PRINT "Strike any key when corrected"
5220 IF INKEY$ = "" THEN 5220    '  
5230 RESUME ERL - 10             '  

     3.0   ERDEV  ERDEV$.    -
          24H,
    .  Z% = ERDEV    Z%
 ,      13-15  -
   ,    -    
24H.  Z$ = ERDEV$   Z$ 8-    -
     2-     
.

    .

         , 
    ,     -
.    ,    -
    .          
 ,     . -
      ,    -
     ,    .
       : "Not ready  error  reading
drive A - Abort, Retry, Ignore?"
          ,  
   ,      -
 .     24H   
 MS DOS,         -
.        AH  0 
       1,    .
BP:SI      , -
    .   , 
  AH      ,  
          DI.   
  (    ):

              

    0         ,   
    1       
    2        
    3       
    4        
    5        
    6       

                             - 405 -

    7        
    8        
    9         
    A        
    B        
    C       

    AL   ,  
   (0 = A, 1 = B  ..),   2-0 AH 
 .  0 ,     
  ,   -   .   2-1 -
   ,         ,
  00  -    DOS, 01 -  FAT,  10 -  
  11 -    .
     ,      
  :

1.        (-
,    ),     
   .
2.      ,   INT
21H,      .
3.       .

           ,
    IRET,   ,     0   AL,
  , 1  -        2 -
  .    ,    
  ,      
     ,        ,
   .     IRET 
  ,      
   ,        
,  12.     (   )
    :

   :  IP, CS, 

  ,   AX, BX, CX, DX, SI, DI, BP,
    :      DS, ES, IP, CS, 

   MS DOS       .  
   ,      ,
   DOS.      
    ,        .
  ,       3.0 MS DOS 
     ,  FCB   -
 .         -
  ,   AX    -
.       59H,
  BX  0.        
         
,    24H.
        AX  ,     
   (, "  ")  
   (, " "   -
 ).  BH      , 
     .  ,  1  ,  

                             - 406 -

 , ..    ,     -
  .       
,   ,   .. BL 
,    ,    "-
", ""  "  ". , CH
 ,        : 
 ,  ,  ?
         .  
  .         MS DOS 3.0.  
,   MS DOS 3.0      -
,  ,  AT,      -
   .    ,  ,
   MS  DOS  3.0    
    .   [1.1.3]   -
    MS DOS,    .
   ,  ,      -
   .     -
 .  ,    
       EXEC,    -
  ,      - .
         ,  
.     ,   
   AL       4CH  21H 
 .     ,
    4DH  21H (  )
    AL    ,      
.  , AH     ,
    : 0 -   , 1 -  
Ctrl-Break, 2 -       3 -  
 31H,   .
          (  20H  -
.   [1.3.4]),    MS  DOS      
          -
 IF.          
   .      
ERRORLEVEL        ,
     .    
        
          .   
      "  -
"    .